/******************************************************************************
 *  _____     _____
 *  \  __\    \  __\
 *   \ \_\\    \ \_\\
 *    \  __\SS  \  __\roject
 *     \_\       \_\
 *
 * Mateusz Maciąg, Rafał Urbański
 * Komputerowe Systemy Sterowania
 *****************************************************************************/

#ifndef ARXPRESET_H
#define ARXPRESET_H

#include <string>
#include <vector>

#include <boost/smart_ptr.hpp>

#include <QMetaType>

namespace RafMat
{
namespace UI
{

// Deklaracja zapowiadająca
class ARXPreset;
typedef boost::shared_ptr<ARXPreset> ARXPresetSPtr;

/**
    Klasa reprezentująca domyślny zestaw parametrów

    Obiekty tej klasy wykorzystywane są przy tworzeniu nowych układóww ARX
    i umożliwiają szybkie stworzenie predefiniowanych układów.

    Klasa wspiera tylko obiekty stacjonarne, lub conajwyżej niestacjonarne
    przejście z obiektu k=1 na dany w \i presecie.

    Konfiguracja obiektów przechowywana jest już jako łańcuchy znakowe,
    i nadaje się do wysłania przez interfejs IConfigurable.
    \i Preset posiada równiesz informacje o tym, jaki jest minimalny
    rząd obiektu mogącego zrealizować ów \i preset (nie można np.
    przypisać parametrów obiektu inercyjnego obiektowi, który został
    zdefiniowany z maksymalnym rzędem 0).
*/
class ARXPreset
{
public:
    /**
        Konstruktor ustawiający wszystko.

        \param [in] presetName Nazwa \i presetu.
        \param [in] objName Nazwa predefiniowanego obiektu.
        \param [in] numerator Licznik transmitancji.
        \param [in] denominator Mianownik transmitancji.
        \param [in] delay Opóźnienie układu.
        \param [in] swTime Moment włączenia parametrów.
        \param [in] minADegree Minimalny stopień mianownika wymagany przez \i preset.
        \param [in] minBDegree Minimalny stopień licznika wymagany przez \i preset.
        \param [in] minDelay Minimalne opóźnienie wymagane przez \i preset.
    */
    ARXPreset(std::string presetName, std::string objName,
              std::string numerator, std::string denominator, std::string SDnumerator,
              std::string delay, std::string swTime,
              int minADegree, int minBDegree, int minCDegree, int minAgDegree, int minD,int minDelay
              );

    /**
        Zwraca listę pszystkich predefiniowanych obiektów.
        \return Stały wektor \i presetów.
    */
    static const std::vector<ARXPresetSPtr>& presets();

    /** Zwraca licznik transmitancji. */
    std::string getNumerator() const { return m_numerator; }

    /** Zwraca mianownik transmitancji. */
    std::string getDenominator() const { return m_denominator; }

    /** Zwraca licznik wielomianu przy e(i). */
    std::string getSDnumerator() const { return m_SDnumerator; }

    /** Zwraca licznik wielomianu przy e(i). */
    std::string getDDden() const { return m_DDden; }

    /** Zwraca opóźnienie obiektu. */
    std::string getD() const { return m_d; }

    /** Zwraca opóźnienie obiektu. */
    std::string getDelay() const { return m_delay; }

    /** Zwraca moment włączenia parametrów. */
    std::string getSwitchTime() const { return m_switchTime; }

    /** Zwraca nazwę obiektu. */
    std::string getObjectName() const { return m_objName; }

    /** Zwraca nazwę \i presetu. */
    std::string getPresetName() const { return m_presetName; }

    /** Zwraca minimalny wymagany stopień mianownika transmitancji. */
    int getMinADegree() const { return m_minADegree; }

    /** Zwraca minimalny wymagany stopień licznika transmitancji. */
    int getMinBDegree() const { return m_minBDegree; }

    /** Zwraca minimalny wymagany stopień licznika transmitancji przy e(i). */
    int getMinCDegree() const { return m_minCDegree; }

    /** Zwraca minimalne wymagane opóźnienie transportowe układu. */
    int getMinDelay() const { return m_minDelay; }

    /** Zwraca minimalny wymagany stopień mianownika transmitancji przy delta(i). */
    int getMinAgDegree() const { return m_minAgDegree; }

    /** Zwraca minimalne wymagane d. */
    int getMinD() const { return m_minD; }

private:

    /** Tworzy listę \i presetów. */
    static void initPresets();

    /** Lista \i presetów. */
    static std::vector<ARXPresetSPtr> m_presets;

    // Pola przechowujące konfigurację:
    const std::string m_numerator;
    const std::string m_denominator;
    const std::string m_SDnumerator;
    const std::string m_DDden;
    const std::string m_delay;
    const std::string m_d;
    const std::string m_switchTime;

    const std::string m_objName;
    const std::string m_presetName;

    const int m_minADegree;
    const int m_minBDegree;
    const int m_minCDegree;
    const int m_minAgDegree;
    const int m_minD;
    const int m_minDelay;
};

}
}

Q_DECLARE_METATYPE(RafMat::UI::ARXPresetSPtr)

#endif // ARXPRESET_H
